// 语法
// arr.reduce(function(prev,cur,index,arr){
// ...
// }, init);

// 参数：

// prev 必需。累计器累计回调的返回值; 表示上一次调用回调时的返回值，或者初始值 init;
// cur 必需。表示当前正在处理的数组元素；
// index 可选。表示当前正在处理的数组元素的索引，若提供 init 值，则起始索引为- 0，否则起始索引为1；
// arr 可选。表示原数组；
// init 可选。表示初始值。


const arr = [1,2,3,4,5,6,7,8,9]

const sum = arr.reduce((prev, cur, index, arr) => {
    console.log(prev, cur, index);
    return prev + cur;
})

//在这里reduce的作用就是对这个数组进行求和，迭代了4次，函数迭代的初始值是1，也就是默认值（数组的第一项），prev的值是每次计算后的值。
console.log('arr:', arr, 'sum:', sum);


// 设置函数的初始迭代值
// const arr = [1,2,3,4,5];
// const sum = arr.reduce((prev,cur,index,arr) => {
//     console.log(prev,cur,index);
//     return prev + cur;
// },5); 
// console.log('arr:',arr,'sum:',sum);


// reduce的应用
// 数组求和
// let arr = [1,2,3,4,5]
// console.log(arr.reduce((a,b) => a + b)) // - 15
// console.log(arr.reduce((a,b) => a * b))  // - 120


// 计算数组中每个元素出现的次数
// var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice', 'Bob', 'Bob'];
// var countedNames = names.reduce(function (allNames, name) {
//   console.log(allNames,name);
//   if (name in allNames) {
//     allNames[name]++;
//   }
//   else {
//     allNames[name] = 1;
//   }
//   return allNames;
// }, {});
// console.log(countedNames);
// 运行结果：分析：
// 由于设置了迭代初始值，allNames的第一个值是一个空对象，此时name为Alice，然后进行判断，发现在allNames中没有Alice属性，所以就将Alice对应的属性值赋为1
// 后面没有重复的是一样的道理，如果碰到重复值，就会将该属性值加1，这样就能计算元素重复的次数了。